package data.framework.web.controller;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import data.framework.service.AbstractService;

public abstract class AbstractController {

	protected Logger logger = LoggerFactory.getLogger(getClass());

	/**
	 * 将Object 转换成字符串
	 * 
	 * @param value
	 *            输出值ֵ
	 * @return 输出值，对于null将返回空串
	 */
	protected String parseString(Object value) {
		if (value == null)
			return "";

		return value.toString();
	}

	/**
	 * 对字符串值进行格式化输出。例如将 null 输出为空串。
	 * 
	 * @param value
	 * @return
	 */
	protected String formatString(String value) {
		return (value == null) ? "" : value.toString();
	}

	/**
	 * 将 java.lang.Object 转换成 java.lang.Boolean。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值
	 */
	protected Boolean parseBoolean(Object value) {
		if (value == null || value.toString().length() == 0)
			return null;

		return Boolean.parseBoolean(value.toString());
	}

	/**
	 * 将 java.lang.Boolean 转换为字符串。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值，对于 null 返回 空串
	 */
	protected String formatBoolean(Boolean value) {
		return (value == null) ? "" : value.toString();
	}

	/**
	 * 根据格式化字符串将一个 java.lang.Boolean 转换为字符串。<br/>
	 * 格式化字符串的格式为 "true文本|false文本"。
	 * 
	 * @param value
	 *            输入值
	 * @param format
	 *            格式化字符串
	 * @return 输出值，对于 null 返回空串
	 */
	protected String formatBoolean(Boolean value, String format) {
		if (value == null)
			return "";

		if (format != null && format.length() != 0) {
			String[] temp = format.split("\\|");
			return value ? temp[0] : temp[1];
		}

		return value.toString();
	}

	/**
	 * 将 java.lang.Object 转换为 java.lang.Integer。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值
	 */
	protected Integer parseInteger(Object value) {
		if (value == null || value.toString().length() == 0)
			return null;

		return Integer.parseInt(value.toString());
	}

	/**
	 * 将 java.lang.Integer 转换为字符串。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值，将 null 转换为空串
	 */
	protected String formatInteger(Integer value) {
		return (value == null) ? "" : value.toString();
	}

	/**
	 * 将 java.lang.Object 转换为 java.lang.Date。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值
	 */
	protected Date parseDate(Object value) {
		if (value == null || value.toString().length() == 0)
			return null;

		try {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
					.parse(value.toString());
		} catch (ParseException ex) {
			throw new RuntimeException(ex);
		}
	}

	/**
	 * 将 java.util.Date 转换为字符串。
	 * 
	 * @param date
	 *            输入值
	 * @return 输出值，null转换成空串
	 */
	protected String formatDate(Date date) {
		if (date == null)
			return "";

		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
				.format(date);
	}

	/**
	 * 根据一个 实体类 (Entity) 的索引来加载该实体。当 value 值为 null 时返回 null。
	 * 
	 * @param <E>
	 *            实体类类型
	 * @param <K>
	 *            操作该实体类的服务类类型
	 * @param value
	 *            实体索引(主键)
	 * @param service
	 *            操作实体的服务类实例
	 * @return 要加载的实体类实例
	 */
	protected <E, K extends AbstractService<E>> E parseEntity(Object value,
			K service) {
		if (value == null)
			return null;

		return ((AbstractService<E>) service).load(value.toString());
	}

	/**
	 * 页面输出格式化方法。将字符串中的特殊字符用转义字符替代。
	 * 
	 * @param value
	 *            输入值
	 * @return 输出值
	 */
	protected String formatHtml(String value) {
		if (value == null || value.length() == 0)
			return "";

		return value.replace("<", "&lt;").replace(">", "&gt;")
				.replace("&", "&amp;")
				.replace(System.getProperty("line.separator"), "<br/>");
	}

}
